# PIL(Python Imaging Library)是一个用于处理图像的常用 Python 库，提供了丰富的图像处理功能。Image 模块是 PIL 库中的核心模块之一，它包含了各种用于处理和操作图像的类和函数。
import torch
from PIL import Image

def make_416_image(image_path):
    img=Image.open(image_path)
    w=img.size[0]
    h=img.size[1]
    temp=max(w,h)
    # 使用了 PIL 库的 Image.new() 函数来创建一个新的图像，命名为 mask
    # color=(0,0,0): 这是创建图像时的背景色，使用元组指定 RGB 值，其中 (0, 0, 0) 表示黑色
    mask=Image.new(mode='RGB',size=(temp,temp),color=(0,0,0))
    # 使用 PIL 库的 paste() 方法将图像 img 粘贴到 mask 图像上
    # (0, 0)：粘贴的起始位置，这是一个元组，指定了图像粘贴的左上角坐标
    mask.paste(img,(0,0))
    return mask

def iou(box, boxes, mode="inter"):
    cx, cy, w, h = box[2], box[3], box[4], box[5]
    cxs, cys, ws, hs = boxes[:, 2], boxes[:, 3], boxes[:, 4], boxes[:, 5]

    box_area = w * h # 最小面积
    boxes_area = ws * hs # 最大面积

    _x1, _x2, _y1, _y2 = cx - w/2, cx + w/2, cy - h/2, cy + h/2
    _xx1, _xx2, _yy1, _yy2 = cxs - ws / 2, cxs + ws / 2, cys - hs / 2, cys + hs / 2

    xx1 = torch.maximum(_x1, _xx1) # 左上角   最大值
    yy1 = torch.maximum(_y1, _yy1) # 左上角   最大值
    xx2 = torch.minimum(_x2, _xx2) # 右下角  最小值
    yy2 = torch.minimum(_y2, _yy2) # 右下角  最小值

    # 将输入input张量每个元素的夹紧到区间 [min,max][min,max]，并返回结果到一个新张量。
    w = torch.clamp(xx2 - xx1, min=0) # ★夹
    h = torch.clamp(yy2 - yy1, min=0)

    inter = w * h

    if mode == 'inter':
        return inter / (box_area + boxes_area - inter) #交集除以并集
    elif mode == 'min':
        return inter / torch.min(box_area, boxes_area)

def nms(boxes, thresh, mode='inter'):
    # [:, 1] 表示对 boxes 取所有行的第二列（索引为 1）。argsort() 函数用于返回张量中元素按指定维度排序后的索引值。
    args = boxes[:, 1].argsort(descending=True)
    sort_boxes = boxes[args]
    keep_boxes = []

    while len(sort_boxes) > 0:
        _box = sort_boxes[0]
        keep_boxes.append(_box)

        if len(sort_boxes) > 1:
            _boxes = sort_boxes[1:]
            # print(_clses.shape)
            # print(_cls.shape)
            # print(mask.shape, "-------------------")
            # print(_boxes)
            # print(_boxes.shape)

            _iou = iou(_box, _boxes, mode)
            sort_boxes=_boxes[_iou< thresh]

        else:
            break

    return keep_boxes


if __name__ == '__main__':
    mask=make_416_image('data/images/000261.jpg')
    mask.show()
    # box = torch.Tensor([2, 2, 3, 3, 6])
    # boxes = torch.Tensor([[2, 2, 3, 3, 6], [2, 2, 4, 4, 5], [2, 2, 5, 5, 4]])
    # print(iou(box, boxes, mode="inter"))
    # print(nms(boxes, 0.1))